#ifndef COMMONHEAD_H
#define COMMONHEAD_H
#ifdef USAGECOROUTINE
#ifdef __linux__
#include <ucontext.h>
#endif

#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#ifdef __linux__
#include <sys/time.h>
#endif

#ifdef __linux__

#define STACK_SIZE (8*1024)         // 每个协程8KB栈空间
#define MAX_COROUTINES 1048576      // 最大协程数

#define TIME_SUB_MS(tv1, tv2) ((tv1.tv_sec - tv2.tv_sec) * 1000 + (tv1.tv_usec - tv2.tv_usec) / 1000)

// c语言打印开关
// #define PRINTFCMODE

typedef void(*coroutine_func)(void* arg);// 协程函数类型

typedef enum {
    COROUTINE_READY,     // 就绪状态
    COROUTINE_RUNNING,   // 运行状态
    COROUTINE_SUSPEND,   // 挂起状态
    COROUTINE_DEAD       // 结束状态
} CoroutineState;

//协程结构体
typedef struct {
    int id;                     // 协程ID
    int fd;                     // 协程文件描述符
    ucontext_t ctx;             // 协程上下文
    coroutine_func func;        // 协程函数
    void* arg;                  // 函数参数
    CoroutineState state;       // 当前状态
    uint8_t stack[STACK_SIZE];  // 协程栈空间
} Coroutine;

// 全局调度器结构
typedef struct {
    ucontext_t main_ctx;                    // 主流程上下文
    Coroutine* coroutines[MAX_COROUTINES];  // 协程数组
    int current_id;                         // 当前运行协程ID
    int id_max;                             // 最大协程id
    int epfd;                               //epoll_create返回值
} Scheduler;

Scheduler *GetInstance_crt();
extern struct timeval begin;
#endif

#endif//USAGECOROUTINE
#endif